package com.sam.designpatterns

/**
 * 策略模式
 */

interface Strategy {
    fun name(): String

    // 算法策略方法
    fun algorithm()
}

class StrategyFirst : Strategy {
    override fun name(): String {
        return "第一个锦囊"
    }

    override fun algorithm() {
        println("拜见乔国老，并把刘备娶亲的事情搞得东吴人尽皆知")
    }
}

class StrategySecond : Strategy {
    override fun name(): String {
        return "第二个锦囊"
    }

    override fun algorithm() {
        println("用谎言（曹操打荆州）骗泡在温柔乡里的刘备回去荆州")
    }
}

class StrategyThird : Strategy {
    override fun name(): String {
        return "第三个锦囊"
    }

    override fun algorithm() {
        println("让孙尚香摆平东吴的追兵，她是孙权妹妹，东吴将领惧她三分")
    }
}

class Context(val name: String) {
    var strategy: Strategy? = null

    fun doStrategy() {
        println("$name 打开了 ${strategy?.name()}:")
        strategy?.algorithm()
    }
}

fun main() {
    val childDragon = Context("赵云")
    // 到东吴打开第一个锦囊
    println("赵云领命，带了500 士兵护送刘备前去东吴。到了南徐")

    childDragon.strategy = StrategyFirst()
    childDragon.doStrategy()
    println("吴国太见刘备，同意婚事，假戏真做\n")

    // 到年底打开第二个锦囊
    println("刘备被新婚度蜜月，忘回荆州，赵云几次劝告也无用，到年底")
    childDragon.strategy = StrategySecond()
    childDragon.doStrategy()
    println("次日江边祭祖，孙尚香一起逃往荆州\n")

    // 有追兵无路可走时打开第三个锦囊
    println("周瑜派兵追赶，拦住去路")
    childDragon.strategy = StrategyThird()
    childDragon.doStrategy()
    println("孙尚香怒斥追兵，追兵让路，周瑜后赶上时，关二爷带着援兵赶到\n")
}